package org.cooperativa.controller;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.EJBException;
import javax.enterprise.context.SessionScoped;
import javax.faces.event.ActionEvent;
import javax.inject.Inject;
import javax.inject.Named;
import org.cooperativa.controller.util.JsfUtil;
import org.cooperativa.dao.TransaccionDetalleFacade;
import org.cooperativa.entities.TransaccionDetalle;

@Named(value = "transaccionDetalleController")
@SessionScoped
public class TransaccionDetalleController extends AbstractController<TransaccionDetalle> implements Serializable {

    @Inject
    private TransaccionDetalleFacade ejbFacade;
    @Inject
    private TransaccionController transaccionController; //Se inyecta el controlador para obtener el ID de la transaccion recien creada

    private TransaccionDetalle current;
    
    //variable usada para mostrar u ocultar el panel que muestra la informacion del detalle de la transaccion    
    private Boolean detalleCreado = false;
   

    private List<TransaccionDetalle> detailList = new ArrayList<TransaccionDetalle>();
    
    /***************Inyectando el proveedorController para insertar su id en la tabla Transaccion***************/
    //private TransaccionController transaccionController = (TransaccionController)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("transaccionController");    

    
    
    public TransaccionDetalleController() {
        super(TransaccionDetalle.class);
    }

    @PostConstruct
    public void init() {
        super.setFacade(ejbFacade);
    }
    
    public TransaccionDetalle getCurrent() {
        if (current == null) {
            current = new TransaccionDetalle();            
        }
        //Asignando como cantidad 1, ya que sera fijo para cada detalle de la transaccion
        current.setCantidad(1);
        return current;
    }
   
      
    public Boolean getDetalleCreado() {
        return detalleCreado;
    }

    public void setDetalleCreado(Boolean detalleCreado) {
        this.detalleCreado = detalleCreado;
    }
    
    /***************Funcion que permitira obtener todos los detalles de la transaccion que se esta creando*******/
       
	public List<TransaccionDetalle> getDetailList() {                
		return detailList; 
	}
               
    
//    @ManagedProperty(value="#{transaccionController}")
//	private TransaccionController transaccionController;
//
//	public void setTransaccionController(TransaccionController transaccionController) {
//		this.transaccionController = transaccionController;
//	}
                
    /**************************************************************************************/
    
    /*****Metodo utilizado para crear un nuevo transaccion******/
    public void createNew(ActionEvent event) {
        
        //Lo primero que se debe hacer es agregar a current el id de la transaccion recien creada
        current.setIdTransaccion(transaccionController.getCurrent());
        
        String successMessage = ResourceBundle.getBundle("/Bundle").getString("TransaccionDetalleCreated");
        
        try {
            //Lo primero que se debe hacer es agregar a current el id de la transaccion recien creada
            //current.setIdTransaccion(transaccionController.getCurrent());
            
            //lo siguiente es asignar los valores para auditoria de la BD
            current.setCreatedBy(1); //modificar luego para que ponga el id del usuario
            current.setCreationDate(new Date());
            current.setLastUpdateBy(1);
            current.setLastUpdateDate(new Date());
            
            ejbFacade.create(current);
            
            if(detalleCreado == false){
                detalleCreado = true;
            }
            
            //Se agrega a la lista para mostrarlo en el datatable que contiene el detalle de la transaccion
            detailList.add(current);
            
            //Reseteamos los campos del detalle que se muestran en pantalla
            current = new TransaccionDetalle();
            
            JsfUtil.addSuccessMessage(successMessage);
        } catch (EJBException ex) {
            String msg = "";
            Throwable cause = JsfUtil.getRootCause(ex.getCause());
            if (cause != null) {
                msg = cause.getLocalizedMessage();
            }
            if (msg.length() > 0) {
                JsfUtil.addErrorMessage(msg);
            } else {
                JsfUtil.addErrorMessage(ex, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
            }
        } catch (Exception ex) {
            Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, null, ex);
            JsfUtil.addErrorMessage(ex, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
        }
    }
    
    //Metodo utilizado para borrar un elemento del detalle de la transaccion
    public String removeItem(TransaccionDetalle item) {

        try {
            getFacade().remove(item);
            
            detailList.remove(item);
            
            JsfUtil.addSuccessMessage(ResourceBundle.getBundle("/Bundle").getString("TransaccionDetalleDeleted"));
            
        } catch (Exception e) {
            JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
        }
        return null;
    }
    
}
